package com.zhoug.common.utils;

import android.view.View;


import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.TimeUnit;

/**
 * 点击事件防抖(即短时间内多次点击)
 *
 * @author: zhoug
 * @since: 2025-07-16
 */
public class ClickDebounce {
    private static final String TAG = ">>>ClickDebounce";
    // 默认防抖时间间隔（500毫秒）
    private static final long DEFAULT_DEBOUNCE_INTERVAL = TimeUnit.MILLISECONDS.toMillis(500);
    /**
     * 防抖时间
     */
    private static long mDebounceInterval = DEFAULT_DEBOUNCE_INTERVAL;
    /**
     * 使用WeakHashMap避免内存泄漏，存储每个View的最后点击时间
     */
    private static final Map<View, Long> mLastClickMap = new WeakHashMap<>();


    /**
     * 设置全局防抖时间
     *
     * @param debounceInterval
     */
    public static void setDebounceInterval(long debounceInterval) {
        if (debounceInterval > 0) {
            ClickDebounce.mDebounceInterval = debounceInterval;
        } else {
            ClickDebounce.mDebounceInterval = DEFAULT_DEBOUNCE_INTERVAL;
        }
    }


    /**
     * 包装点击监听器（支持默认防抖时间）
     *
     * @param listener 原始点击监听器
     * @return 带防抖功能的监听器
     */
    public static View.OnClickListener wrap(View.OnClickListener listener) {
        return wrap(listener, mDebounceInterval);
    }


    /**
     * 包装点击监听器（自定义防抖时间）
     *
     * @param listener         原始点击监听器
     * @param debounceInterval 防抖时间（毫秒）
     * @return 带防抖功能的监听器
     */
    public static View.OnClickListener wrap(final View.OnClickListener listener, final long debounceInterval) {
        return new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Long previousClickTime = mLastClickMap.get(v);
                long currentTime = System.currentTimeMillis();
                // 首次点击或超过防抖间隔
                if (previousClickTime == null || currentTime - previousClickTime > debounceInterval) {
                    mLastClickMap.put(v, currentTime);
                    if(listener!=null){
                        listener.onClick(v);
                    }
                }else{
                    LogUtils.w(TAG, "onClick:点击事件防抖,拒绝执行");
                }
            }
        };
    }


}
